package com.bit.java_doc_searcher.controller;

import com.bit.java_doc_searcher.searcher.DocSearcher;
import com.bit.java_doc_searcher.searcher.Result;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 搜索接口的web后端控制器
 * 基于@RestController提供返回json字符串的后端接口
 */
@RestController
public class DocSearcherController {

    // 文档搜索对象，通过包装的搜索方法提供搜索功能
    private static DocSearcher searcher = new DocSearcher();
    // json框架jackson框架中，处理json和Java对象的类
    private ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 提供的web后端服务接口
     * @RequestMapping中value指定服务的路径，produces设置响应头Content-Type指定响应正文的数据格式
     * @ResponseBody表示方法的返回值作为响应正文
     * @param query 请求数据会基于SpringMVC框架，将键名为query的内容设置到变量上
     * @return
     * @throws JsonProcessingException
     */
    @RequestMapping(value = "/searcher", produces = "application/json;charset=utf-8")
    @ResponseBody
    public String search(@RequestParam("query") String query) throws JsonProcessingException {
        // 参数是查询词, 返回值是响应内容.
        // 参数 query 来自于请求 URL 的 query string 中的 query 这个 key 的值
        List<Result> results = searcher.search(query);
        // 将搜索结果转换为json字符串并设置到响应体中
        return objectMapper.writeValueAsString(results);
    }
}
